package lambda;

import java.io.File;
import java.io.FileFilter;

/**
 * lambda表达式  JDK8推出后推出的一个新特性
 * lambda可以以更简短的语法定义匿名内部类。
 * 
 * 不是所有使用匿名内部类的情况都可以用lambda代替。只有实现的接口中仅有一个抽象
 * 方法时，才可以使用lambda。
 * 
 * 语法:
 * (参数列表)->{
 * 		方法体代码
 * }
 * 
 * @author 范传奇
 *
 */
public class LambdaDemo {
	public static void main(String[] args) {
		//使用匿名内部类形式创建FileFilter
		FileFilter filter = new FileFilter() {
			public boolean accept(File file) {
				return file.getName().endsWith(".txt");
			}			
		};		
		/*
		 * lambda表达式是java编译器认可的，最终会被编译器改为内部类创建。
		 * 并且编译器会结合程序上下文分析出实际上实例化的是哪个类，以及重写的
		 * 是哪个方法(因为接口要求只有一个抽象方法，因此肯定是该方法)。并且
		 * 方法的参数列表中无需再定义参数的类型，只需要指定形参名即可。
		 */
		FileFilter filter2 = (file)->{
			return file.getName().endsWith(".txt");
		};
		
		/*
		 * 当lambda表达式中只有一句代码时，我们可以忽略"{}".如果这句代码含有
		 * return关键字，那么return关键字必须忽略。
		 */
		FileFilter filter3 = (file)->file.getName().endsWith(".txt");   
		
		File dir = new File(".");
//		File[] subs = dir.listFiles(filter3);
		File[] subs = dir.listFiles(
			(file)->file.getName().endsWith(".txt")
		);
		System.out.println(subs.length);//1
	}
}









